package cn.cerc.sample.forms;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Description;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import cn.cerc.db.core.DataRow;
import cn.cerc.db.core.DataSet;
import cn.cerc.db.core.Utils;
import cn.cerc.mis.client.ServiceExecuteException;
import cn.cerc.mis.client.ServiceSign;
import cn.cerc.mis.core.IPage;
import cn.cerc.mis.core.RedirectPage;
import cn.cerc.mis.other.MemoryBuffer;
import cn.cerc.mis.security.MenuGroupEnum;
import cn.cerc.mis.security.Permission;
import cn.cerc.mis.security.Webform;
import cn.cerc.sample.SampleServicesConfig.SvrEmployeeV3;
import cn.cerc.sample.config.UserBuffer;
import cn.cerc.sample.entity.EmployeeInfoEntity;
import cn.cerc.sample.enums.GenderEnum;
import cn.cerc.sample.ui.CustomForm;
import cn.cerc.sample.ui.UIAppendPage;
import cn.cerc.sample.ui.UIModifyPage;
import cn.cerc.sample.ui.UINotice;
import cn.cerc.sample.ui.UISearchPage;
import cn.cerc.ui.core.UrlRecord;
import cn.cerc.ui.grid.UIDataStyle;
import cn.cerc.ui.vcl.UIInput;
import cn.cerc.ui.vcl.UIUrl;

@Webform(module = "", name = "员工管理", group = MenuGroupEnum.日常操作)
@Permission("user.base")
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class FrmEmployeeV3 extends CustomForm {
    private static final Logger log = LoggerFactory.getLogger(FrmEmployeeV3.class);

    @Description("默认的查询页面")
    @Override
    public IPage execute() throws ServiceExecuteException, IOException {
        // 发送消息范例
        QueueTest1 queue = new QueueTest1();
        log.info("msgId:" + queue.append(this, DataRow.of("code", "a08")));

        QueueTest2 queue2 = new QueueTest2();
        log.info("msgId:" + queue2.append(this, queue2.addItem().setUser("jason")));

        // 使用子线程拉
//        ExecutorService pool = Executors.newFixedThreadPool(1);
//        pool.execute(queue);
//        pool.shutdown();

        // 创建一个自定义页面
        UISearchPage page = new UISearchPage(this);
        page.addCssFile("css/summer.css");
        page.addCssFile("css/FrmEmployeeV3.css");
        new UIUrl(page.getFrontPanel()).setText("返回").setSite("welcome");
        // 检查是否有需要显示的消息，并予以输出
        new UINotice(page.getFrontPanel()).receive(this, "execute");
        // 在底部增加一个按钮
        new UIUrl(page.getFooter()).setText("新增").setSite("FrmEmployeeV3.append");

        // 第3代写法：创建搜索面板
        var define = new UIDataStyle(false).setDataRow(new DataRow());
        define.addField("code_").setName("员工工号").setPlaceholder("请输入员工工号");
        define.addField("searchText_").setName("查询条件").setPlaceholder("请输入查询条件");
        page.createSearch(define).gatherRequest();

        // 调用查询服务
        DataSet dataOut = SvrEmployeeV3.search.call(this, define.current()).getDataOutElseThrow();

        // 第3代UI写法：定义要显示的数据列
        var style = new UIDataStyle(true).setDataSet(dataOut);
        style.addFieldIt();
        style.addField("code_").setPlaceholder("请输入工号");
        style.addField("name_").setPlaceholder("请输入姓名");
        // 注：此栏位并不存在, 仅作范例使用
        style.addField("password").setName("取款密码").setWidth(6).setPlaceholder("请输入密码").onOutput(styleData -> {
            if (styleData.executant() instanceof UIInput input)
                input.setInputType(UIInput.TYPE_PASSWORD);
        });
        style.addField("gender_").onGetText(style.getEnum(GenderEnum.class));
        style.addField("entry_date_");
        style.addField("enable_").onGetText(data -> data.getBoolean() ? "是" : "否");
        style.addField("opera")
                .setName(this.getClient().isPhone() ? "" : "操作")
                .onGetText(data -> UIUrl
                        .html(String.format("FrmEmployeeV3.modify?code=%s", data.source().getString("code_")), "修改"));

        // 在电脑下显示的视图处理器
        page.createGridView(style);
        // 在手机上显示的视图处理器
        var view = page.createPhoneView(style);
        view.addLine().addIt();
        view.addLine().addCell("code_", "name_");
        view.addLine().addCell("gender_", "enable_");
        view.addLine().addCell("entry_date_", "opera");

        // 返回页面
        return page;
    }

    @Description("增加页面")
    public IPage append() {
        // 创建一个自定义页面
        UIAppendPage page = new UIAppendPage(this);
        page.addCssFile("css/summer.css");
        page.addCssFile("css/FrmEmployeeV3.css");
        new UIUrl(page.getFrontPanel()).setText("返回").setSite("FrmEmployeeV3");

        // 创建一个增加专用的面板
        var define = new UIDataStyle(false).setDataRow(new DataRow());
        define.setEntityClass(EmployeeInfoEntity.class);
        define.addField("code_");
        define.addField("name_");
        define.addField("gender_").onGetText(define.getEnum(GenderEnum.class));
        define.addField("entry_date_");
        // 创建一个html-form并尝试采集数据（若用户有提交就会有数据）
        if (page.createForm(define).gatherRequest() > 0) {
            ServiceSign svr = SvrEmployeeV3.append.call(this, define.current());
            if (svr.isFail())
                return page.setMessage(svr.dataOut().message());
            String code = svr.dataOut().getString("code_");
            // 传递成功的消息到修改页面
            UINotice.sendInfo(getSession(), this.getClass(), "modify", String.format("新增员工 %s", code));
            // 跳转到修改页面
            String modifyUrl = UrlRecord.builder("FrmEmployeeV3.modify").put("code", code).build().getUrl();
            return new RedirectPage(this, modifyUrl);
        }
        return page;
    }

    @Description("修改页面")
    public IPage modify() {
        // 创建一个自定义页面
        UIModifyPage page = new UIModifyPage(this);
        page.addCssFile("css/summer.css");
        page.addCssFile("css/FrmEmployeeV3.css");
        new UIUrl(page.getFrontPanel()).setText("返回").setSite("FrmEmployeeV3");
        // 检查是否有需要显示的消息，并予以输出
        new UINotice(page.getFrontPanel()).receive(this, "modify");

        // 启用页面缓存
        try (MemoryBuffer buff = new MemoryBuffer(UserBuffer.Notice, this.getUserCode(), "FrmEmployeeV3.modify")) {
            String code = page.getValue(buff, "code");
            if (Utils.isEmpty(code))
                return page.setMessage("code 不允许为空");

            ServiceSign svr1 = SvrEmployeeV3.download.call(this, DataRow.of("code_", code));
            if (svr1.isFail())
                return page.setMessage(svr1.dataOut().message());

            new UIUrl(page.getFooter()).setText("删除").setSite("FrmEmployeeV2.delete").putParam("code", code);

            // 定义一个修改专用的面板
            var define = new UIDataStyle(false).setDataRow(svr1.dataOut().current());
            define.addField("code_").setReadonly(true);
            define.addField("name_");
            define.addField("gender_").onGetText(define.getEnum(GenderEnum.class));
            define.addField("entry_date_");
            define.addField("enable_");

            // 判断是否用户有点击保存按钮，若有则读取所有的提交到actionForm.getRecord()
            if (page.createForm(define).gatherRequest() > 0) {
                ServiceSign svr = SvrEmployeeV3.modify.call(this, define.current());
                if (svr.isFail())
                    return page.setMessage(svr.dataOut().message());
                // 传递成功的消息到修改页面
                UINotice.sendInfo(getSession(), this.getClass(), "modify", "修改成功");
                // 跳转到修改页面
                return new RedirectPage(this, "FrmEmployeeV3.modify");
            }
        }

        return page;
    }

    @Description("删除页面")
//    public IPage delete(@PathVariable("code") String code) {
//    public IPage delete(String code) {
    public IPage delete() {
        String code = getRequest().getParameter("code");

        // 接收参数并传给相应的服务
        ServiceSign svr = SvrEmployeeV3.delete.call(this, DataRow.of("code_", code));
        if (svr.isFail()) {
            // 将执行失败的原因，传递到默认的查询页面
            UINotice.sendInfo(getSession(), this.getClass(), "execute", svr.dataOut().message());
            // 重定向到默认的查询页面
            return new RedirectPage(this, "FrmEmployeeV3");
        }
        // 传递成功的消息到默认的查询页面
        UINotice.sendInfo(getSession(), this.getClass(), "execute", String.format("%s 删除成功", code));
        // 重定向到默认的查询页面
        return new RedirectPage(this, "FrmEmployeeV3");
    }
}
